import pygame.font
from pygame.sprite import Group

from ship import Ship

class ScoreBoard:
    """显示得分信息的类"""
    # 计分板

    def __init__(self, ai_game):
        """初始化显示得分涉及的属性"""
        self.ai_game = ai_game
        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()
        self.settings = ai_game.settings
        self.stats = ai_game.stats

        # 显示得分信息时使用的字体设置
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)
        # 准备初始得分图像
        self.prep_score() # 初始化时即调用一次将得分渲染成图像的方法，因为会更新得分，所以把这部分另外写成一个方法
        self.prep_high_score() # 初始化最高分显示图像
        self.prep_level() # 初始化等级显示图像
        self.prep_ships() # 初始化剩余飞船图像

    def prep_score(self):
        """将得分转换为一幅渲染的图象"""
        rounded_score = round(self.stats.score, -1)
        score_str = "{:,}".format(rounded_score)
        self.score_image = self.font.render(score_str, True, self.text_color, self.settings.bg_color) # 得分surface对象

        # 在屏幕右上角显示得分
        self.score_rect = self.score_image.get_rect()
        self.score_rect.right = self.screen_rect.right - 20 # 得分图像右侧距屏幕右侧20像素
        self.score_rect.top = 20 # 距屏幕上方20像素

    def prep_high_score(self):
        """将最高得分转换为渲染的图像"""
        high_score = round(self.stats.high_score, -1)
        high_score_str = "{:,}".format(high_score)
        self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.settings.bg_color)

        # 最高得分位置设置，在屏幕顶部中央
        self.high_score_rect = self.high_score_image.get_rect()
        self.high_score_rect.centerx = self.screen_rect.centerx # 居中放置
        self.high_score_rect.top = self.score_rect.top # 与分数平行

    def prep_level(self):
        """将等级转换为渲染的图像"""
        level_str = str(self.stats.level)
        self.level_image = self.font.render(level_str, True, self.text_color, self.settings.bg_color)

        # 设置等级图像的位置信息，将等级放在得分下边
        self.level_rect = self.level_image.get_rect()
        self.level_rect.right = self.score_rect.right # 右侧与得分右侧对其
        self.level_rect.top = self.score_rect.bottom + 10 # 顶部与得分底部距离10像素

    def prep_ships(self):
        """显示还剩余多少飞船"""
        self.ships = Group()
        for ship_number in range(self.stats.ships_left):
            ship = Ship(self.ai_game)
            ship.rect.x = 10 + ship_number * ship.rect.width
            ship.rect.y = 10
            self.ships.add(ship) # 直接调用ship内的方法创建ship图像

    def check_high_score(self):
        """检查是否诞生了最高得分"""
        if self.stats.score > self.stats.high_score:
            self.stats.high_score = self.stats.score
            self.prep_high_score() # 刷新最高得分对象的显示

    def show_score(self):
        """在屏幕上显示得分"""
        self.screen.blit(self.score_image, self.score_rect) # 显示当前得分
        self.screen.blit(self.high_score_image, self.high_score_rect) # 显示最高得分
        self.screen.blit(self.level_image, self.level_rect) # 显示等级
        self.ships.draw(self.screen)